package com.miyu.system.service.file.impl;


import cn.hutool.core.lang.Pair;
import com.miyu.system.dao.file.FileManagerDao;
import com.miyu.system.pojo.system.SysFileManager;
import com.miyu.system.service.file.FileService;
import io.minio.MinioClient;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.mica.core.utils.BeanUtil;
import org.liuxp.minioplus.api.StorageService;
import org.liuxp.minioplus.api.model.dto.FileMetadataInfoDTO;
import org.liuxp.minioplus.api.model.vo.CompleteResultVo;
import org.liuxp.minioplus.api.model.vo.FileCheckResultVo;
import org.liuxp.minioplus.api.model.vo.FileMetadataInfoVo;
import org.springframework.stereotype.Service;

import java.io.InputStream;
import java.util.List;

@Slf4j
@Service
@RequiredArgsConstructor
public class FileServiceImpl  implements FileService {

    private final StorageService storageService;
    private final FileManagerDao fileManagerDao;


    /**
     * 上传任务初始化
     *
     * @param fileMd5      文件md5
     * @param fullFileName 文件名（含扩展名）
     * @param fileSize     文件长度
     * @param isPrivate    是否私有 false:否 true:是
     * @param userId       用户编号
     * @return {@link FileCheckResultVo}
     */
    @Override
    public FileCheckResultVo init(String fileMd5, String fullFileName, long fileSize, Boolean isPrivate, String userId) {
        return storageService.init(fileMd5, fullFileName, fileSize, isPrivate, userId);
    }

    /**
     * 取得文件下载地址
     *
     * @param fileKey 文件KEY
     * @param userId  用户编号
     * @return 文件下载地址
     */
    @Override
    public String download(String fileKey, String userId) {
        return storageService.download(fileKey, userId);
    }

    /**
     * 取得原图地址
     *
     * @param fileKey 文件KEY
     * @param userId  用户编号
     * @return 原图地址
     */
    @Override
    public String image(String fileKey, String userId) {
        return storageService.image(fileKey, userId);
    }

    /**
     * 取得缩略图地址
     *
     * @param fileKey 文件KEY
     * @param userId  用户编号
     * @return 缩略图地址
     */
    @Override
    public String preview(String fileKey, String userId) {
        return storageService.preview(fileKey, userId);
    }

    /**
     * 查询元数据信息
     *
     * @param key 文件key
     * @return 文件元数据信息
     */
    @Override
    public FileMetadataInfoVo one(String key) {
        return storageService.one(key);
    }

    /**
     * 合并已分块的文件
     *
     * @param fileKey     文件关键
     * @param partMd5List 文件分块md5列表
     * @param userId      用户编号
     * @return {@link CompleteResultVo}
     */
    @Override
    public CompleteResultVo complete(String fileKey, List<String> partMd5List, String userId) {
        return storageService.complete(fileKey, partMd5List, userId);
    }

    /**
     * 查询元数据信息
     *
     * @param fileMetadataInfo 查询入参
     * @return 文件元数据信息集合
     */
    @Override
    public List<FileMetadataInfoVo> list(FileMetadataInfoDTO fileMetadataInfo) {
        return storageService.list(fileMetadataInfo);
    }

    /**
     * 创建文件
     * 尽量不要用本方法处理大文件，大文件建议使用前端直传
     *
     * @param fullFileName 文件名（含扩展名）
     * @param isPrivate    是否私有 false:否 true:是
     * @param userId       用户编号
     * @param fileBytes    文件字节流
     * @return 文件元数据信息
     */
    @Override
    public FileMetadataInfoVo createFile(String fullFileName, Boolean isPrivate, String userId, byte[] fileBytes) {
        return storageService.createFile(fullFileName, isPrivate, userId, fileBytes);
    }

    /**
     * 创建文件
     * 尽量不要用本方法处理大文件，大文件建议使用前端直传
     *
     * @param fullFileName 文件名（含扩展名）
     * @param isPrivate    是否私有 false:否 true:是
     * @param userId       用户编号
     * @param inputStream  文件输入字节流
     * @return 文件元数据信息
     */
    @Override
    public FileMetadataInfoVo createFile(String fullFileName, Boolean isPrivate, String userId, InputStream inputStream) {
        log.info(fullFileName);
        return storageService.createFile(fullFileName, isPrivate, userId, inputStream);
    }

    /**
     * 创建文件
     * 尽量不要用本方法处理大文件，大文件建议使用前端直传
     *
     * @param fullFileName 文件名（含扩展名）
     * @param isPrivate    是否私有 false:否 true:是
     * @param userId       用户编号
     * @param url          文件地址
     * @return 文件元数据信息
     */
    @Override
    public FileMetadataInfoVo createFile(String fullFileName, Boolean isPrivate, String userId, String url) {
        return storageService.createFile(fullFileName, isPrivate, userId, url);
    }

    /**
     * 创建大文件
     * 大文件建议使用本方法
     *
     * @param fullFileName 文件名（含扩展名）
     * @param md5          文件名MD5
     * @param fileSize     文件名大小
     * @param isPrivate    是否私有 false:否 true:是
     * @param userId       用户编号
     * @param inputStream  文件输入字节流
     * @return 文件元数据信息
     */
    @Override
    public FileMetadataInfoVo createBigFile(String fullFileName, String md5, long fileSize, Boolean isPrivate, String userId, InputStream inputStream) {
        return storageService.createBigFile(fullFileName, md5, fileSize, isPrivate, userId, inputStream);
    }

    /**
     * 根据文件key读取文件字节流
     *
     * @param fileKey 文件key
     * @return 文件字节流
     */
    @Override
    public Pair<FileMetadataInfoVo, byte[]> read(String fileKey) {
        return storageService.read(fileKey);
    }

    /**
     * 根据文件key删除文件
     *
     * @param fileKey 文件key
     * @return 是否成功
     */
    @Override
    public Boolean remove(String fileKey) {
        return storageService.remove(fileKey);
    }
}
